www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/turbo_decoder.m

    function decodedBit = turbo_decoder(preDecodeBit,SNRdB)
% turbo 解码函数。对输入的三流比特进行尾比特还原,再进行Turbo译码
% 输入:preDecodeBit:译码器输入的软信息
%       SNRdB:信噪比 单位dB
% 输出:decodedBit:解码后的二进制序列
% 
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-07-11
%  ==========================================================
global LTE_par

% 编码生成器
g = [ 1 0 1 1;
      1 1 0 1 ];
K = size(g,2); 
m = K - 1;

decodeAlg = LTE_par.UE_par.decodeAlg;       % 解码算法 0:Log-Map算法 1:Sova算法 
niter = LTE_par.UE_par.niter;               % turbo译码迭代次数

lenTotal = length(preDecodeBit);            % 变换后信息比特加尾比特长度
lenInfo = lenTotal-4;                       % 信息比特长度
lenTotal = lenTotal-1;                      % turbo输出附加3个尾比特后长度
REC1 = zeros(1,2*lenTotal);                 % 接收端解码器 REC 1输入
REC2 = zeros(1,2*lenTotal);                 % 接收端解码器 REC 2输入


SNRreal = 10^(0.1*SNRdB); % 得到SNR的真值
preDecodeBit = 0.5*4*SNRreal*preDecodeBit; % 乘以信道置信度值


tailBit = preDecodeBit(:,end-K+1:end);
% disp('接收端收到尾比特')
% disp(tailBit)
tailBit([1 4 2 5 3 6 7 10 8 11 9 12]) = tailBit;
tailBit = reshape(tailBit,3,4);
% disp('接收端还原尾比特')
% disp(tailBit)

sysBit = [preDecodeBit(1,1:lenInfo),transpose(tailBit(:,1))];
parityBit = [preDecodeBit(2,1:lenInfo),transpose(tailBit(:,2))];

% 接收端解码器 REC 1输入 系统比特和校验比特交叉放置
REC1(1:2:end) = sysBit;
REC1(2:2:end) = parityBit;

alphaInternal = internal_leaver_par(lenInfo);    % turbo 内交织表
temp = preDecodeBit(alphaInternal);
sysBit = [temp,transpose(tailBit(:,3))];
parityBit = [preDecodeBit(3,1:lenInfo),transpose(tailBit(:,4))];

% 接收端解码器 REC 2输入 系统比特和校验比特交叉放置
REC2(1:2:end) = sysBit;
REC2(2:2:end) = parityBit;

% Initialize extrinsic information
L_a = zeros(1,lenTotal); % 先验信息
L_e = zeros(1,lenTotal); % 外信息

tail1 = zeros(1,m); % REC1 的尾比特
tail2 = zeros(1,m); % REC2 的尾比特

for iter = 1:niter
    % 解码器 1
    L_a(alphaInternal) = L_e(1:end-m);  % 先验信息
    L_a(end-m+1:end) = tail1;
    if decodeAlg == 0
        L_all = logmapo(REC1, g, L_a, 1);  % 完整信息
    elseif decodeAlg == 1
        L_all = max_log_map(REC1, g, L_a, 1);
    else
        L_all = sova0(REC1, g, L_a, 1);  % 完整信息
    end
    L_e = L_all - 2*REC1(1:2:2*lenTotal) - L_a;  % 外信息
%     tail1 = L_e(end-m+1:end);
    
    % 解码器 2
    L_a(1:end-m) = L_e(alphaInternal);  % 先验信息
    L_a(end-m+1:end) = tail2;
    if decodeAlg == 0
        L_all = logmapo(REC2, g, L_a, 2);  % 完整信息
    elseif decodeAlg == 1
        L_all = max_log_map(REC2, g, L_a, 2);
    else
        L_all = sova0(REC2, g, L_a, 2);  % 完整信息
    end
    L_e = L_all - 2*REC2(1:2:2*lenTotal) - L_a;  % 外信息
%     tail2 = L_e(end-m+1:end);
     
end	%iter
decodedBit(alphaInternal) = (sign(L_all(1:end-m))+1)/2;